package dbmanager

import (
	"gitee.com/night-tc/gobige/global"
	"gitee.com/night-tc/gobige/msgdef/protomsg"
)

// DelayLoadMgr.go 文件定义了延时加载模块的管理器。
// 主要包括：
// 1. DelayLoadMgr：用于管理延时加载的模块，支持从数据库加载数据并初始化。
// 2. 提供了发送数据库加载请求、处理加载回调等功能。

// DelayLoadMgr 是延时加载模块的管理器，负责处理延时加载的逻辑。
type DelayLoadMgr struct {
	IServiceModel
	user *DBPlayer
}

// SendDBLoadMsg 发送数据库加载请求，根据是否单表加载选择不同的请求消息类型。
// 参数：
//   - user: 当前玩家对象，用于设置回调函数和发送消息。
func (this *DelayLoadMgr) SendDBLoadMsg(user *DBPlayer) {
	this.user = user
	if ok, limit := this.IsSingleTable(); ok {
		msg := new(protomsg.DBGetPlayerTableReq)
		msg.PID = user.pid
		msg.SpaceID = user.spaceid
		msg.EntityID = user.player.GetEntityID()
		msg.SrvID = user.sid
		msg.BackKey = global.GetSrvInst().GetNewEID()
		user.SetBackFunc(msg.BackKey, this.DelayLoad)
		msg.Table = this.GetTableNames()[0]
		msg.Limit = limit
		PostDBPlayer(user.pid, user.player.GetEntityID(), msg)
	} else {
		msg := new(protomsg.DBGetPlayerInfoReq)
		msg.PID = user.pid
		msg.SpaceID = user.spaceid
		msg.EntityID = user.player.GetEntityID()
		msg.SrvID = user.sid
		msg.BackKey = global.GetSrvInst().GetNewEID()
		user.SetBackFunc(msg.BackKey, this.DelayLoad)
		msg.Tables = append(msg.Tables, this.GetTableNames()...)
		PostDBPlayer(user.pid, user.player.GetEntityID(), msg)
	}
}

// DelayLoad 处理数据库加载的回调，将加载的数据初始化并同步给客户端。
// 参数：
//   - tmpli: 从数据库加载的数据，按表名和模型分类。
//
// 返回值：
//   - bool: 始终返回 true，表示处理成功。
func (this *DelayLoadMgr) DelayLoad(tmpli map[string]IDataBaseModel) bool {

	lis := make(map[string][]IDataBaseModel)
	for _, v := range tmpli {
		if tli, ok := lis[v.TableName()]; !ok {
			tli = make([]IDataBaseModel, 1, 10)
			tli[0] = v
			lis[v.TableName()] = tli
		} else {
			tli = append(tli, v)
			lis[v.TableName()] = tli
		}
	}
	this.LoadDB(lis)
	this.InitLoaded()
	this.AllDataSyncClient()
	this.user.CheckLoaded()
	return true
}
